home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / asm_n_z.zip / VIDEO.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-04-07  |  19.8 KB  |  448 lines

  1. ;-------------------------------------------------------------------------------
  2. ;
  3. ;    video.asm                                        created 5-11-85
  4. ;
  5. ;    VIDEO ROUTINES
  6. ;    (C) COPYRIGHT 1985 BY THOMAS D. WEBB
  7. ;
  8. ;    MODIFIED FOR MICROSOFT 'C' BY GREGORY ETCHELL            4-1-86
  9. ;
  10. ;    ALL RIGHTS RESERVED.
  11. ;    PERMISSION IS GRANTED FOR UNLIMITED PERSONAL, NON-COMMERCIAL USE ONLY.
  12. ;
  13. ;-------------------------------------------------------------------------------
  14. TITLE              VIDEO
  15.  
  16. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  17. _TEXT   ENDS
  18.  
  19. CONST   SEGMENT  WORD PUBLIC 'CONST'
  20. CONST   ENDS
  21.  
  22. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  23. _BSS    ENDS
  24.  
  25. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  26. _DATA   ENDS
  27.  
  28. DGROUP  GROUP    CONST, _BSS, _DATA
  29.         ASSUME    CS: _TEXT, DS: DGROUP, SS: DGROUP, ES:DGROUP
  30.  
  31.  
  32. _BSS               SEGMENT
  33.  
  34. BUFFER_SIZE        EQU       2000D    ;THE VIDEO BUFFER SIZE IN WORDS
  35. NUM_BYTES_IN_ROW   EQU       80       ;NUMBER OF BYTES IN A ROW
  36. MONOCHROME_SEGADR  EQU       0B000H   ;ADDRESS OF MONOCHROME BUFFER
  37. GRAPHICS_SEGADR    EQU       0B800H   ;ADDRESS OF GRAPHICS BUFFER
  38.                    EVEN
  39. _BSS               ENDS
  40.  
  41. _TEXT              SEGMENT
  42.  
  43. ;-------------------------------------------------------------------------------
  44. ; CLEAR            (ROUTINE 1)
  45. ;      THIS ROUTINE CLEARS THE SCREEN
  46. ; THE C LANGUAGE CALL IS:
  47. ;      CLEAR();
  48. ; THE ASSEMBLY CALL IS:
  49. ;      CALL CLEAR
  50. ;-------------------------------------------------------------------------------
  51.                    PUBLIC    _clear
  52. _clear             PROC      NEAR
  53.                    PUSH      BP          ;THE FRAME POINTER
  54.                    MOV       AH,6        ;SCROLL ACTIVE PAGE UP
  55.                    MOV       AL,019H     ;CLEAR 25 LINES
  56.                    MOV       CX,0H       ;UPPER LEFT OF SCROLL
  57.                    MOV       DX,2479H    ;LOWER RIGHT OF SCROLL
  58.                    MOV       BH,7H       ;USE NORMAL ATTRIBUTE ON BLANKED LINE
  59.                    INT       10H         ;VIDEO-IO
  60.                    POP       BP          ;THE FRAME POINTER
  61.                    RET
  62. _clear             ENDP
  63.  
  64. ;-------------------------------------------------------------------------------
  65. ; LOCATE           (ROUTINE 2)
  66. ;        THIS ROUTINE WILL LOCATE THE CURSOR AT A ROW AND COLUMN ON THE SCREEN
  67. ; THE C LANGUAGE CALL IS:
  68. ;        LOCATE(ROW,COLUMN);
  69. è; THE ASSEMBLY CALL IS:
  70. ;        MOV    DX,COL     ;RANGE IS 0 - 79
  71. ;        PUSH   DX
  72. ;        MOV    DX,ROW     ;RANGE IS 0 - 24
  73. ;        PUSH   DX
  74. ;        CALL   LOCATE
  75. ;-------------------------------------------------------------------------------
  76.                    PUBLIC    _locate
  77. _locate            PROC      NEAR                ;PROC TO LOCATE THE CURSOR
  78.                    PUSH      BP                  ;THE FRAME POINTER
  79.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  80.                    MOV       DH,[BP+4]           ;GET THE ROW..
  81.                    MOV       DL,[BP+6]           ;..AND THE COL
  82.                    MOV       BH,0H               ;GRAPHICS PAGE NO.
  83.                    MOV       AH,2H               ;SET_CURSOR_POSITION
  84.                    INT       10H                 ;VIDEO-IO
  85.                    POP       BP                  ;THE FRAME POINTER
  86.                    RET
  87. _locate            ENDP
  88.  
  89. ;-------------------------------------------------------------------------------
  90. ; CURSIZE          (ROUTINE 3)
  91. ;        THIS ROUTINE SETS THE SIZE OF THE CURSOR
  92. ; THE C LANGUAGE CALL IS:
  93. ;        CURSIZE(START_LINE,STOP_LINE);
  94. ; THE ASSEMBLY CALL IS:
  95. ;        MOV    DX,STOP_LINE   ;13 IS NORMAL STOP_LINE FOR MONOCHROME ADAPTOR
  96. ;        PUSH   DX
  97. ;        MOV    DX,START_LINE  ;12 IS NORMAL START_LINE FOR MONOCHROME ADAPTOR
  98. ;        PUSH   DX
  99. ;        CALL   CURSIZE
  100. ;-------------------------------------------------------------------------------
  101.                    PUBLIC    _cursize
  102. _cursize           PROC      NEAR
  103.                    PUSH      BP                  ;THE FRAME POINTER
  104.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  105.                    MOV       CH,[BP+4]           ;CURSOR START LINE
  106.                    MOV       CL,[BP+6]           ;CURSOR STOP LINE
  107.                    MOV       AH,1H               ;SET CURSOR TYPE
  108.                    INT       10H                 ;VIDEO-IO
  109.                    POP       BP                  ;THE FRAME POINTER
  110.                    RET
  111. _cursize           ENDP
  112.  
  113. ;-------------------------------------------------------------------------------
  114. ; GET_MODE         (ROUTINE 4)
  115. ;     THIS ROUTINE RETURNS THE CRT MODE IN AL, AND THE NUMBER OF CHARACTER
  116. ;     COLUMNS ON THE SCREEN IN AH
  117. ; THE C LANGUAGE CALL IS: mode_area.value = get_mode();
  118. ;     WHERE mode_area is defined as:
  119. ; union
  120. ;   {
  121. ;    int value;
  122. ;    struct
  123. ;       {
  124. è;         char al;           /*al EQ 7 is monochrome*/
  125. ;         char ah;           /*number of character columns on the screen*/
  126. ;       } al_ah;
  127. ;   } mode_area;
  128. ;
  129. ; THE ASSEMBLY CALL IS:
  130. ;      CALL GET_MODE
  131. ;-------------------------------------------------------------------------------
  132.                    PUBLIC      _get_mode
  133. _get_mode          PROC        NEAR
  134.                    PUSH        BP           ;THE FRAME POINTER
  135.                    MOV         AX,0         ;CLEAR THE REG
  136.                    MOV         AH,15        ;GET CURRENT VIDEO MODE
  137.                    INT         10H          ;VIDEO-IO
  138.                    POP         BP           ;THE FRAME POINTER
  139.                    RET
  140. _get_mode          ENDP
  141.  
  142. ;-------------------------------------------------------------------------------
  143. ; SET_VIDEO_ADDRESS (ROUTINE 5)
  144. ;     THIS ROUTINE IS USED IN SEVERAL OF THE OTHER ROUTINES TO TEST THE VIDEO
  145. ;     MODE AND TO SET THE CORRECT VIDEO BUFFER ADDRESS (MONOCHROME OR GRAPHICS).
  146. ;     THE VIDEO BUFFER ADDRESS IS RETURNED IN AX.
  147. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  148. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  149. ;-------------------------------------------------------------------------------
  150. SET_VIDEO_ADDRESS  PROC      NEAR
  151.                    CALL      _get_mode           ;GET CRT MODE
  152.                    CMP       AL,7H               ;IS IT A MONOCHROME CARD?
  153.                    JNE       ITS_GRAPHICS
  154.                    MOV       AX,MONOCHROME_SEGADR ;MONOCHROME BUFFER SEG ADDR
  155.                    JMP       RETURN
  156. ITS_GRAPHICS:      MOV       AX,GRAPHICS_SEGADR  ;GRAPHICS BUFFER SEG ADR
  157. RETURN:            RET
  158. SET_VIDEO_ADDRESS  ENDP
  159.  
  160. ;-------------------------------------------------------------------------------
  161. ; CALC_VIDEO_OFFSET   (ROUTINE 6)
  162. ;     THIS ROUTINE IS USED BY SEVERAL OF THE ROUTINES TO CALCULATE THE OFFSET
  163. ;     INTO THE VIDEO BUFFER FOR MOVING CHARACTERS INTO OR FROM THE VIDEO BUFFER.
  164. ;     DX MUST BE SET TO THE ROW, AND CX MUST BE SET TO THE COLUMN BEFORE THIS
  165. ;     ROUTINE IS EXECUTED. THE OFFSET IS RETURNED IN AX.
  166. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  167. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  168. ;-------------------------------------------------------------------------------
  169. CALC_VIDEO_OFFSET PROC      NEAR
  170.                   MOV       AX,NUM_BYTES_IN_ROW ;NUMBER OF BYTES IN ROW
  171.                   MUL       DX                  ;RESULT IS IN AX
  172.                   ADD       AX,CX               ;THE COL
  173.                   SHL       AX,1                ;MULTIPLY BY 2 FOR CHAR/ATTR
  174.                   RET
  175. CALC_VIDEO_OFFSET ENDP
  176.  
  177. ;-------------------------------------------------------------------------------
  178. ; ISRTSTR         (ROUTINE 7)
  179. ;       THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS A
  180. ;       NULL-TERMINATED STRING, ALONG WITH AN ATTRIBUTE, DIRECTLY INTO THE VIDEO
  181. ;       BUFFER
  182. ; THE C LANGUAGE CALL IS:  ISRTSTR(ROW,COL,STRING,ATTR);
  183. ; THE ASSEMBLY CALL IS:
  184. ;        MOV    DX,ATTRIBUTE   ;THE ATTRIBUTE BYTE (VALUE OF NORMAL IS 7)
  185. ;        PUSH   DX
  186. ;        LEA    DX,STRING      ;GET ADDRESS OF THE STRING
  187. ;        PUSH   DX
  188. ;        MOV    DX,COL         ;RANGE IS 0 - 79
  189. ;        PUSH   DX
  190. ;        MOV    DX,ROW         ;RANGE IS 0 - 24
  191. ;        PUSH   DX
  192. ;        CALL   ISRTSTR
  193. ;-------------------------------------------------------------------------------
  194.                    PUBLIC    _isrtstr
  195. _isrtstr           PROC      NEAR
  196.  
  197.                    PUSH      ES
  198.  
  199.                    PUSH      BP                  ;THE FRAME POINTER
  200.                    MOV       BP,SP               ;POINT TO STACK
  201.  
  202.                    MOV       DX,[BP+6]           ;GET THE ROW
  203.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  204.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  205.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  206.  
  207.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  208.                    MOV       DH,[BP+12]          ;GET THE ATTRIBUTE BYTE
  209.  
  210.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  211.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  212.  
  213. ISRT_LOOP:         MOV       DL,BYTE PTR [SI]    ;THE CHARACTER TO INSERT
  214.                    CMP       DL,0                ;IS IT END OF STRING?
  215.                    JE        ISRTSTR_EXIT        ;EXIT IF END OF STRING
  216.                    MOV       ES:WORD PTR [DI],DX ;MOVE CHAR AND ATTR TO CRT BUF
  217.                    ADD       DI,2H               ;POINT TO NEXT CRT BUF LOC
  218.                    ADD       SI,1H               ;POINT TO NEXT SORC STRING BYTE
  219.                    JMP       ISRT_LOOP           ;GO MOVE ANOTHER WORD
  220.  
  221. ISRTSTR_EXIT:      POP       BP                  ;THE FRAME POINTER
  222.                    POP       ES
  223.  
  224.                    RET
  225. _isrtstr           ENDP
  226.  
  227. ;-------------------------------------------------------------------------------
  228. ; ISRTCNT          (ROUTINE 8)
  229. ;        THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS
  230. ;        N BYTES FROM AN ARRAY DIRECTLY INTO THE VIDEO BUFFER, ALONG WITH AN
  231. ;        ATTRIBUTE BYTE
  232. ; THE C LANGUAGE CALL IS:
  233. ;        ISRTCNT(ROW,COL,STRING,ATTR,NUM_BYTES);
  234. è; THE ASSEMBLY CALL IS:
  235. ;        MOV    DX,NUM_BYTES      ;THE NUMBER OF BYTES TO BE DISPLAYED
  236. ;        PUSH   DX
  237. ;        MOV    DX,ATTRIBUTE      ;THE ATTRIBUTE BYTE (NORMAL VALUE IS 7)
  238. ;        PUSH   DX
  239. ;        LEA    DX,ARRAY          ;GET THE CHARACTER ARRAY ADDRESS
  240. ;        PUSH   DX
  241. ;        MOV    DL,COL            ;RANGE IS 0 - 79
  242. ;        PUSH   DX
  243. ;        MOV    DL,ROW            ;RANGE IS 0 - 24
  244. ;        PUSH   DX
  245. ;        CALL   ISRTCNT
  246. ;-------------------------------------------------------------------------------
  247.                    PUBLIC    _isrtcnt
  248. _isrtcnt           PROC      NEAR
  249.  
  250.                    PUSH      ES
  251.  
  252.                    PUSH      BP                  ;THE FRAME POINTER
  253.                    MOV       BP,SP               ;POINT TO STACK
  254.  
  255.                    MOV       DX,[BP+6]           ;GET THE ROW
  256.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  257.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  258.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  259.  
  260.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  261.                    MOV       DH,[BP+12]          ;GET THE ATTRIBUTE BYTE
  262.                    MOV       CX,[BP+14]          ;GET NUMBER OF BYTES TO INSERT
  263.  
  264.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  265.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  266.  
  267. ISRTCNT_LOOP:      MOV       DL,BYTE PTR [SI]    ;THE CHARACTER TO INSERT
  268.                    MOV       ES:WORD PTR [DI],DX ;MOVE CHAR AND ATTR TO CRT BUF
  269.                    ADD       DI,2H               ;POINT TO NEXT CRT BUF LOC
  270.                    ADD       SI,1H               ;POINT TO NEXT SORC STRING BYTE
  271.                    LOOP      ISRTCNT_LOOP        ;GO MOVE ANOTHER WORD
  272.  
  273. ISRTCNT_EXIT:      POP       BP                  ;THE FRAME POINTER
  274.                    POP       ES
  275.  
  276.                    RET
  277. _isrtcnt           ENDP
  278.  
  279. ;-------------------------------------------------------------------------------
  280. ; PUTCHAT          (ROUTINE 9)
  281. ;     WRITES A CHARACTER AND ATTRIBUTE TO THE SCREEN. THE CURSOR DOES NOT MOVE.
  282. ; THE C LANGUAGE CALL IS:  PUTCHAT(CHARACTER,ATTR);
  283. ; THE ASSEMBLY LANGUAGE CALL IS:
  284. ;         MOV    DX,0
  285. ;         MOV    DL,CHARACTER      ;THE CHARACTER TO BE DISPLAYED
  286. ;         PUSH   DX
  287. ;         MOV    DL,ATTRIBUTE      ;THE ATTRIBUTE TO BE DISPLAYED
  288. ;         PUSH   DX
  289. è;         CALL   PUTCHAT
  290. ;-------------------------------------------------------------------------------
  291.                    PUBLIC    _putchat
  292. _putchat           PROC      NEAR
  293.                    PUSH      BP                  ;THE FRAME POINTER
  294.                    MOV       BP,SP               ;POINT TO STACK
  295.                    MOV       AL,[BP+4]           ;THE CHARACTER
  296.                    MOV       BL,[BP+6]           ;THE ATTRIBUTE
  297.                    MOV       BH,0H               ;DISPLAY PAGE #
  298.                    MOV       CX,1H               ;NUMBER OF CHARACTERS TO WRITE
  299.                    MOV       AH,9H               ;WRITE CHAR/ATTR AT CURPOS
  300.                    INT       10H                 ;VIDEO_IO
  301.                    POP       BP                  ;THE FRAME POINTER
  302.                    RET
  303. _putchat           ENDP
  304.  
  305. ;-------------------------------------------------------------------------------
  306. ; CRTBUF           (ROUTINE 10)
  307. ;       ACCEPTS TWO PARAMETERS:
  308. ;          1.   SAVE = 0 AND REPLACE = 1.
  309. ;          2.   THE ADDRESS TO SAVE THE VIDEO BUFFER INTO OR REPLACE THE VIDEO
  310. ;               BUFFER FROM
  311. ;       CALLS CRTSAVE TO SAVE THE CRT BUFFER,
  312. ;       CALLS CRTREPL TO REPLACE THE CRT BUFFER.
  313. ; THE C LANGUAGE CALL IS: CRTBUF(SAVE,SAVE_AREA); OR CRTBUF(REPLACE,SAVE_AREA);
  314. ; THE ASSEMBLY CALL IS:
  315. ;            LEA  DX,SAVE_AREA ;GET ADDRESS OF SAVE_AREA
  316. ;            PUSH DX
  317. ;            MOV  DX,0         ;SAVE (MOV DX,1 TO REPLACE)
  318. ;            PUSH DX
  319. ;            CALL CRTBUF
  320. ;-------------------------------------------------------------------------------
  321.                    PUBLIC    _crtbuf
  322. _crtbuf            PROC      NEAR
  323.                    PUSH      BP                  ;THE FRAME POINTER
  324.                    MOV       BP,SP               ;POINT TO STACK
  325.  
  326.                    MOV       DX,[BP+4]           ;SAVE/RESTORE INDICATOR
  327.                    CMP       DX,0                ;SAVE THE CRT BUFFER?
  328.                    JNE       RESTORE_IT
  329. SAVE_IT:           CALL      CRTSAVE
  330.                    JMP       CRTBUF_EXIT
  331. RESTORE_IT:        CALL      CRTREPL
  332.  
  333. CRTBUF_EXIT:       POP       BP                  ;THE FRAME POINTER
  334.  
  335.                    RET
  336. _crtbuf            ENDP
  337.  
  338. ;-------------------------------------------------------------------------------
  339. ; CRTSAVE          (ROUTINE 11)
  340. ;      THIS ROUTINE IS CALLED BY CRTBUF TO SAVE THE CRT BUFFER INTO A SAVE AREA.
  341. ;
  342. ;-------------------------------------------------------------------------------
  343. CRTSAVE            PROC      NEAR
  344.  
  345.                    PUSH      ES                  ;ES AND DS ARE MODIFIED..
  346.                    PUSH      DS                  ;..SO SAVE THEM
  347.  
  348.                    PUSH      BP                  ;SAVE THE FRAME POINTER
  349.                    MOV       BP,SP               ;ADDRESS THE STACK
  350.  
  351.                    MOV       CX,DS               ;DATA SEG IS THE DESTINATION
  352.                    MOV       ES,CX               ;ES HAS DESTINATION SEG ADDR
  353.                    MOV       DI,[BP+14]          ;DESTINATION OFFSET
  354.  
  355.                    MOV       CX,BUFFER_SIZE      ;THE BUFFER SIZE IN WORDS
  356.  
  357.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  358.                    MOV       DS,AX               ;..VIDEO BUFFER ADDRESS INTO DS
  359.  
  360.                    MOV       SI,0                ;SOURCE OFFSET
  361.  
  362.                    CLD                           ;SET DF=0 TO MOVE FORWARD
  363. REP                MOVSW                         ;MOVE 2000 WORDS
  364.                                                  ;THE FRAME POINTER
  365.                    POP       BP                  ;MUST RESTORE DS..
  366.                    POP       DS                  ;..AND ES
  367.                    POP       ES
  368.                    RET
  369. CRTSAVE            ENDP
  370.  
  371. ;-------------------------------------------------------------------------------
  372. ; CRTREPL          (ROUTINE 12)
  373. ;   THIS ROUTINE IS CALLED BY CRTBUF TO REPLACE THE CRT BUFFER FROM A SAVE AREA.
  374. ;
  375. ;-------------------------------------------------------------------------------
  376. CRTREPL            PROC      NEAR
  377.  
  378.                    PUSH      ES                  ;ES IS MODIFIED, SO SAVE IT
  379.  
  380.                    PUSH      BP                  ;SAVE THE FRAME POINTER
  381.                    MOV       BP,SP               ;ADDRESS THE STACK
  382.  
  383.                    MOV       SI,[BP+12]          ;SOURCE OFFSET
  384.  
  385.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  386.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  387.  
  388.                    MOV       DI,0                ;DESTINATION OFFSET
  389.  
  390.                                                  ;DS HAS SOURCE SEG ADDR
  391.                    MOV       CX,BUFFER_SIZE      ;THE BUFFER SIZE IN WORDS
  392.  
  393.                    CLD                           ;SET DF=0 TO MOVE FORWARD
  394. REP                MOVSW                         ;MOVE 2000 WORDS
  395.  
  396.                    POP       BP                  ;THE FRAME POINTER
  397.                    POP       ES                  ;MUST RESTORE ES
  398.                    RET
  399. CRTREPL            ENDP
  400.  
  401. ;-------------------------------------------------------------------------------
  402. ; SCANCRT          (ROUTINE 13)
  403. ;   POSITIONS ITSELF IN THE CRT BUFFER, THEN MOVES N BYTES, NOT NULL-TERMINATED,
  404. ;   TO THE ADDRESS OF AN ARRAY PROVIDED BY THE CALLER.
  405. ;
  406. ; THE C LANGUAGE CALL IS:  SCANCRT(ROW,COL,STRING,NUM_BYTES);
  407. ; THE ASSEMBLY CALL IS:
  408. ;        MOV    DX,NUM_BYTES        ;THE NUMBER OF BYTES TO MOVE
  409. ;        PUSH   DX
  410. ;        LEA    DX,ARRAY            ;GET CHARACTER ARRAY ADDRESS
  411. ;        PUSH   DX
  412. ;        MOV    DX,COL              ;RANGE IS 0 - 79
  413. ;        PUSH   DX
  414. ;        MOV    DX,ROW              ;RANGE IS 0 - 24
  415. ;        PUSH   DX
  416. ;        CALL   SCANCRT
  417. ;-------------------------------------------------------------------------------
  418.                    PUBLIC    _scancrt
  419. _scancrt           PROC      NEAR
  420.  
  421.                    PUSH      ES                  ;ES IS MODIFIED, SO SAVE IT
  422.  
  423.                    PUSH      BP                  ;THE FRAME POINTER
  424.                    MOV       BP,SP               ;POINT TO STACK
  425.  
  426.                    MOV       DX,[BP+6]           ;GET THE ROW
  427.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  428.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  429.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  430.  
  431.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  432.                    MOV       CX,[BP+12]          ;NUMBER OF BYTES TO MOVE
  433.  
  434.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  435.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  436.  
  437. SCAN_LOOP:         MOV       DL,ES:BYTE PTR [DI] ;GET CHAR FROM CRT BUFFER
  438.                    MOV       BYTE PTR[SI],DL     ;MOVE CHAR TO STRING IN CALLER
  439.                    ADD       DI,2H               ;POINT TO NEXT CRT_BUF LOC
  440.                    ADD       SI,1H               ;POINT TO NEXT DEST STRING BYTE
  441.                    LOOP      SCAN_LOOP
  442.  
  443. SCANCRT_EXIT:      POP       BP                  ;THE FRAME POINTER
  444.                    POP       ES                  ;MUST RESTORE ES
  445.  
  446.                    RET
  447. _scancrt           ENDP
  448.  
  449.  
  450. _TEXT              ENDS
  451.                    END
  452.